<?php

/**
 * Абстрактный класс RL_Stream -- поток.
 *
 * В стандартной библиотеке PHP есть потоки (см функции stream_*).
 * Ниасилил реализовать для конкретных объектов.
 *
 * @abstract
 * @package RL
 * @author Lucky <lucky@jetstyle.ru>
 * @version $Id: Stream.php 62 2007-09-05 08:27:21Z lucky $
 */
abstract class RL_Stream
{
	/**
	 * open открыть поток.
	 *
	 * @param mixed $mode флаги записи, чтения и т.п. @see fopen()
	 * @abstract
	 * @access public
	 * @return void
	 */
	abstract public function open($mode);
	/**
	 * close закрыть поток.
	 *
	 * @abstract
	 * @access public
	 * @return void
	 */
	abstract public function close();
	/**
	 * read читать данные из потока.
	 *
	 * @param mixed $size максимальный размер блока для считывания
	 * @abstract
	 * @access public
	 * @return mixed
	 */
	abstract public function read($size);
	/**
	 * passthru выдать данные из потока на стандарный вывод.
	 *
	 * Оптимизация ввиду наличия встроенной функции fpassthru()
	 *
	 * @abstract
	 * @access public
	 * @return void
	 */
	abstract public function passthru();
	/**
	 * seek установить позицию в потоке.
	 *
	 * @param mixed $offset смещение
	 * @param mixed $whence { SEEK_SET | SEEK_END | SEEK_CUR }
	 * @abstract
	 * @access public
	 * @return void
	 */
	abstract public function seek($offset, $whence);
	/**
	 * rewind установить указатель текущего элемента в начало.
	 *
	 * @abstract
	 * @access public
	 * @return void
	 */
	abstract public function rewind();
	/**
	 * eof вернуть флаг "конец файла".
	 *
	 * @abstract
	 * @access public
	 * @return boolean
	 */
	abstract public function eof();

	//!a constructor
	/**
	 * create создать объект для потока указанного типа.
	 *
	 * @param mixed $ctx контекст
	 * @param mixed $type тип создаваемого потока
	 * @access public
	 * @return RL_Stream
	 */
	public function create ($ctx, $type)
	{
		$class = __CLASS__ . '_' . $type;
		$ctx->rh->useClass($class);
		$o = new $class($ctx);
		return $o;
	} // end of function creat

} // end of class RL_Stream

